package com.mini.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;

/**
 * @author zhangxiaobin
 * @title: IPUtils
 * @description: TODO
 * @date 2019/11/414:10
 */
public class IPUtils {

    private static Logger logger = LoggerFactory.getLogger(IPUtils.class);
    private static String localIpAddress = null;
    /**
     * 获取IP地址
     *
     * 使用Nginx等反向代理软件， 则不能通过request.getRemoteAddr()获取IP地址
     * 如果使用了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP地址，X-Forwarded-For中第一个非unknown的有效IP字符串，则为真实IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = null;
        try {
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            logger.error("IPUtils ERROR ", e);
        }

//        //使用代理，则获取第一个IP地址
//        if(StringUtils.isEmpty(ip) && ip.length() > 15) {
//			if(ip.indexOf(",") > 0) {
//				ip = ip.substring(0, ip.indexOf(","));
//			}
//		}

        return ip;
    }

    public static String getLocalIpAddr() {
        if (localIpAddress != null) {
            return localIpAddress;
        } else {
            localIpAddress = System.getProperty("serverIp");
            String[] bondNames = new String[]{"bond0", "eth0", "eth1"};
            String[] arr$ = bondNames;
            int len$ = bondNames.length;

            for(int i$ = 0; i$ < len$; ++i$) {
                String bondName = arr$[i$];
                if (localIpAddress != null) {
                    return localIpAddress;
                }

                try {
                    Enumeration e1 = NetworkInterface.getNetworkInterfaces();

                    while(e1.hasMoreElements()) {
                        NetworkInterface ni = (NetworkInterface)e1.nextElement();
                        if (ni.getName().equals(bondName)) {
                            logger.info("use {} search LocalIpAddr", bondName);
                            Enumeration e2 = ni.getInetAddresses();

                            while(e2.hasMoreElements()) {
                                InetAddress ia = (InetAddress)e2.nextElement();
                                if (!(ia instanceof Inet6Address)) {
                                    localIpAddress = ia.getHostAddress();
                                }
                            }

                            if ("127.0.0.1".equals(localIpAddress)) {
                                localIpAddress = null;
                            }
                            break;
                        }
                    }
                } catch (Exception var10) {
                    logger.error(var10.getMessage(), var10);
                    localIpAddress = null;
                }
            }

            if (localIpAddress != null) {
                return localIpAddress;
            } else {
                try {
                    logger.info("use {} search LocalIpAddr", "getLocalHost");
                    InetAddress inet = InetAddress.getLocalHost();
                    localIpAddress = inet.getHostAddress();
                } catch (UnknownHostException var9) {
                    logger.error(var9.getMessage(), var9);
                    return "";
                }

                return localIpAddress;
            }
        }
    }



}
